`
https://leetcode.cn/problems/letter-tile-possibilities/
`

/**
 * @param {string} tiles
 * @return {number}
 */
var numTilePossibilities = function (tiles) {
  // 这道题就是获取全排列回溯树上的所有节点
  let res = 0
  const track = []
  const used = new Array(tiles.length).fill(false)

  // 排序，让所有相同的元素挨在一起
  const chars = tiles.split('').sort()

  // 套用全排列的框架，修改一下收集部分的代码即可
  function backtrack() {
    res++

    for (let i = 0; i < chars.length; i++) {
      if (used[i]) {
        continue;
      }
      if (i > 0 && chars[i] === chars[i - 1] && !used[i - 1]) {
        continue
      }

      track.push(chars[i])
      used[i] = true
      backtrack()
      track.pop()
      used[i] = false
    }
  }

  backtrack()
  return res - 1
};